package software.lib.dao;

import org.hibernate.Session;

import javax.persistence.NoResultException;
import javax.persistence.Query;
import java.io.Serializable;
import java.util.List;

/**
 * Created by Wang on 2017/5/3.
 */
public interface BaseDao {

    default <T> void add(T obj){
        getSession().save(obj);
    }
    default <T> void update(T obj){
        getSession().update(obj);
    }
    default <T> void delete(T obj){
        getSession().delete(obj);
    }

    default <T> void saveOrUpdate(T obj) {
        getSession().saveOrUpdate(obj);
    }

    default <T> T get(Class<T> clazz, Serializable id){
        return getSession().get(clazz,id);
    }

    default <T> List<T> list(String hql, Object... args){
        Query query=getSession().createQuery(hql);
        for (int i = 0; i < args.length; i++) {
            query.setParameter(i, args[i]);
        }

        @SuppressWarnings("unchecked")
        List<T> list= query.getResultList();
        return list;
    }

    default <T> T uniqueResult(String hql, Object... args){
        try {
            Query query=getSession().createQuery(hql);
            for (int i = 0; i < args.length; i++) {
                query.setParameter(i, args[i]);
            }
            query.setMaxResults(1);
            return (T)query.getSingleResult();
        }catch(NoResultException e){
            return null;
        }
    }

    Session getSession();
}
